package com.xuelang.pipeline.artifact.app.resource.request;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * 表示Harbor外部事件（如PUSH_ARTIFACT）的类
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class HarborEventRequest {

    /**
     * 事件类型
     */
    private String type;

    /**
     * 事件发生时间（时间戳）
     */
    @JsonProperty("occur_at")
    private long occurAt;

    /**
     * 操作者信息
     */
    private String operator;

    /**
     * 事件数据
     */
    @JsonProperty("event_data")
    private ArtifactEventData eventData;


    /**
     * 表示推送资源的事件数据
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class ArtifactEventData {


        /**
         * 推送资源列表
         */
        private List<Resource> resources;

        /**
         * 仓库信息
         */
        private Repository repository;
    }

    /**
     * 推送资源的实体类
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Resource {

        /**
         * 资源的摘要值
         */
        private String digest;

        /**
         * 资源的标签
         */
        private String tag;

        /**
         * 资源的URL
         */
        @JsonProperty("resource_url")
        private String resourceUrl;
    }

    /**
     * 仓库信息的实体类
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Repository {

        /**
         * 仓库创建时间（时间戳）
         */
        @JsonProperty("date_created")
        private long dateCreated;

        /**
         * 仓库名称
         */
        private String name;

        /**
         * 仓库命名空间
         */
        private String namespace;

        /**
         * 仓库全名（包括命名空间）
         */
        @JsonProperty("repo_full_name")
        private String repoFullName;

        /**
         * 仓库类型（例如：私有）
         */
        @JsonProperty("repo_type")
        private String repoType;
    }

}